package com.gitee.deament.server.core.cli.db.list;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.List;

/**
 * RPOPLPUSH source destination
 * 可用版本： >= 1.2.0
 * 时间复杂度： O(1)
 * 命令 RPOPLPUSH 在一个原子时间内，执行以下两个动作：
 *
 * 将列表 source 中的最后一个元素(尾元素)弹出，并返回给客户端。
 *
 * 将 source 弹出的元素插入到列表 destination ，作为 destination 列表的的头元素。
 *
 * 举个例子，你有两个列表 source 和 destination ， source 列表有元素 a, b, c ， destination 列表有元素 x, y, z ，执行 RPOPLPUSH source destination 之后， source 列表包含元素 a, b ， destination 列表包含元素 c, x, y, z ，并且元素 c 会被返回给客户端。
 *
 * 如果 source 不存在，值 nil 被返回，并且不执行其他动作。
 *
 * 如果 source 和 destination 相同，则列表中的表尾元素被移动到表头，并返回该元素，可以把这种特殊情况视作列表的旋转(rotation)操作。
 *
 * 返回值
 * 被弹出的元素。
 * @author deament
 */
@CliHander(command = "RPOPLPUSH")
public class RPOPLPUSHcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        List<String> cliValues = getValues(command);
        if (cliValues.size() !=3) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'RPOPLPUSH' command"));
            return;
        }
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        DBData dbData = SystemConfig.dbData;
        String source = cliValues.get(1);
        String target=cliValues.get(2);

        try {
            Value<List<String>> targetValue =dbData.getList(db, source);
            List<String> value = SystemConfig.dbData.getList(db, source).getValue();
            List<String> targetPush = SystemConfig.dbData.getList(db, source).getValue();
            String remove = value.remove(value.size()-1);

            targetValue.getValue().add(0,remove);


            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(remove));
        }catch (Exception e){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(e.getMessage()));
        }

    }
}
